import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 沈明月
 * Date: 2022-11-02
 * Time: 13:52
 */
public class TestTen {
//二进制1的个数（求一个整数，在内存当中存储时，二进制1的个数）
//法一：
    public static void main1(String[] args) {
        //输入数字：
            Scanner scan = new Scanner(System.in);
            while(scan.hasNextInt()){
                int n = scan.nextInt();
                //计算其二进制中1的个数：
                int count = 0;
                while(n!=0){
                    if((n&1)==1){
                        count++;
                    }
                    n=n>>1;//会造成负数死循环
                }
                System.out.println("该整数的二进制形式中有"+count+"个1");
            }
    }

//法二：
    public static void main2(String[] args) {
        //输入数字：
        Scanner scan = new Scanner(System.in);
        while(scan.hasNextInt()){
            int n = scan.nextInt();
            //计算其二进制中1的个数：
            int count = 0;
            for (int i = 0; i < 31; i++) {//i < 31确保了不会把符号位计算在内
                if(((n >>> i) & 1)!=0){
                    //举例：
                    //0011
                    //0001

                    //0011&0001--->0001==1
                    //0011>>>--->0001
                    //0001&0001--->0001==1,count ++;
                    //0001>>>--->0000
                    //0000&0001--->0000!=1, count不++;
                    count ++;
                }
            }
            System.out.println("该整数的二进制形式中有"+count+"个1");
        }
    }
//改良法二（和法一没差太远）：
    public static void main3(String[] args) {
        //输入数字：
        Scanner scan = new Scanner(System.in);
        while(scan.hasNextInt()){
            int n = scan.nextInt();
            //计算其二进制中1的个数：
            int count = 0;
            while(n != 0){
                if((n&1) != 0){
                    count ++;
                }
                n = n>>>1;
            }
            System.out.println("该整数的二进制形式中有"+count+"个1");
        }
    }
//法三：
    public static void main4(String[] args) {
        //输入数字：
        Scanner scan = new Scanner(System.in);
        while(scan.hasNextInt()){
            int n = scan.nextInt();
            //计算其二进制中1的个数：
            int count = 0;
            while(n != 0){
                n = n & (n-1);
                count ++;
                //举例：求7的二进制形式有几个1

                //0111--->7
                //0110--->6两数按位与，得

                //0110--->6
                //0101--->5两数按位与，得

                //0100--->4
                //0011--->3两数按位与，得

                //0000

                //算了3次才清0，而0111中也恰好也有3个1
            }
            System.out.println("该整数的二进制形式中有"+count+"个1");
        }
    }
}
